# 模糊查询
import ast

from sqlalchemy import func


def caseLike(model,field,parameter):
    """
    模糊查询 like
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("模糊查询 like")
    return getattr(model, field).like('%{parameter}%'.format(parameter=parameter))

# 大于查询gt
def caseGt(model,field,parameter):
    """
    大于查询gt
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("大于查询gt")
    print(field)
    return getattr(model, field)>parameter

# 大于等于查询ge
def caseGe(model,field,parameter):
    """
    大于等于查询ge
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("大于等于查询ge")
    return getattr(model, field) >= parameter

# 小于查询lt
def caselt(model,field,parameter):
    """
    小于查询lt
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("小于查询lt")
    return getattr(model, field) < parameter

# 小于等于查询le
def caseLe(model,field,parameter):
    """
    小于等于查询le
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("小于等于查询le")
    return getattr(model, field) <= parameter

# 精确查询
def caseDefault(model,field,parameter):
    """
    精确查询
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("精确查询")
    return getattr(model, field)==parameter

# in包含列表查询
def caseIn(model,field,parameter):
    """
    in包含列表查询
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("in包含查询")
    if type(parameter)==list:
        return getattr(model, field).in_(parameter)
    else:
        try:
            return getattr(model, field).in_(ast.literal_eval(parameter))
        except:
            return getattr(model, field).in_([parameter])

# isnull(aa,'')查询
def caseIsnull(model,field,parameter):
    """
    isnull(aa,'')查询
    :param model: 模型
    :param field: 字段
    :param parameter:过滤的参数
    :return:
    """
    print("isnull(aa,'')查询")
    # return getattr(model, field)==parameter
    return func.coalesce(getattr(model, field), '')==parameter

CASEFILTER = {
    "like": caseLike,
    "gt": caseGt,
    "ge": caseGe,
    "lt": caselt,
    "le": caseLe,
    "in": caseIn,
    "isnull": caseIsnull,
    "default": caseDefault
}